home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- *
- * NSSDC/CDF SkeletonTable.
- *
- * Version 1.0, 4-Mar-92, Hughes STX
- *
- * Modification history:
- *
- * V1.0 4-Mar-92, J Love Original version.
- *
- ******************************************************************************/
-
- #include "cdfdist.h"
- #include "cdf2skt.h"
-
- /******************************************************************************
- * Global variables.
- ******************************************************************************/
-
- CDFid id;
- Boolean mLog;
- FILE *SKTfp;
- FILE *NRVfp;
- enum NRVlocENUM NRVloc;
-
- /******************************************************************************
- * Online instructions.
- ******************************************************************************/
-
- static char *instructions[] = {
- #if defined(vms)
- "Usage: $ SKELETONTABLE [/SKELETON=<skeleton-path>]",
- " [/noNRV or /NRVfile or /NRVtable] [/[no]LOG]",
- " <cdf-path>",
- #endif
- #if defined(unix)
- "Usage: % skeletontable [-skeleton <skeleton-path>]",
- " [-noNRV or -NRVfile or -NRVtable] [-[no]log]",
- " <cdf-path>",
- #endif
- #if defined(__MSDOS__)
- "Usage: > skeletontable [-skeleton <skeleton-path>]",
- " [-noNRV or -NRVfile or -NRVtable] [-[no]log]",
- " <cdf-path>",
- #endif
- "",
- "Purpose: SkeletonTable produces a skeleton table from a CDF.",
- "",
- " A skeleton table is a text file which can be read",
- " by the CDFskeleton program to build a skeleton CDF.",
- "",
- "Parameter(s): <cdf-path>",
- " The pathname of the CDF to read. Do not enter an",
- " extension. (Required).",
- "",
- #if defined(vms)
- "Qualifier(s): /SKELETON=<skeleton-path>",
- " <skeleton-path> is the pathname of the skeleton table file",
- " to be created. Any valid pathname may be specified (do",
- " not enter an extension). If not specified, the default",
- " skeleton table file name is <cdf-name>.skt in the default",
- " directory (where <cdf-name> is the name portion of",
- " <cdf-path>). (Optional).",
- #endif
- #if defined(unix) | defined(__MSDOS__)
- "Qualifier(s): -skeleton <skeleton-path>",
- " <skeleton-path> is the pathname of the skeleton table file",
- " to be created. Any valid pathname may be specified (do",
- " not enter an extension). If not specified, the default",
- " skeleton table file name is <cdf-name>.skt in the current",
- " directory (where <cdf-name> is the name portion of",
- " <cdf-path>). (Optional).",
- #endif
- "",
- #if defined(vms)
- " /noNRV",
- " /NRVtable",
- " /NRVfile",
- " No more than one of these qualifiers may be specified. If",
- " none are specified, the default is /NRVtable. (Optional).",
- " /noNRV......Ignore all non-record variant (NRV) data",
- " /NRVtable...Put NRV data values in the skeleton table",
- " /NRVfile....Put NRV data values in a separate file. The",
- " name of this file will be <skeleton-path>.nrv",
- " if the /SKELETON qualifier was used. It will",
- " be <cdf-name>.nrv in the default directory",
- " (where <cdf-name> is the name portion of",
- " <cdf-path>) if /SKELETON was not used.",
- #endif
- #if defined(unix) | defined(__MSDOS__)
- " -noNRV",
- " -NRVtable",
- " -NRVfile",
- " No more than one of these qualifiers may be specified. If",
- " none are specified, the default is -NRVtable. (Optional).",
- " -noNRV......Ignore all non-record variant (NRV) data",
- " -NRVtable...Put NRV data values in the skeleton table",
- " -NRVfile....Put NRV data values in a separate file. The",
- " name of this file will be <skeleton-path>.nrv",
- " if the -skeleton qualifier was used. It will",
- " be <cdf-name>.nrv in the current directory",
- " (where <cdf-name> is the name portion of",
- " <cdf-path>) if -skeleton was not used.",
- #endif
- "",
- #if defined(vms)
- " /[no]LOG",
- #endif
- #if defined(unix) | defined(__MSDOS__)
- " -[no]log",
- #endif
- " Specifies whether or not messages are displayed as the",
- " program executes. This includes both informatory and error",
- " messages. The default is no logging.",
- "",
- #if defined(vms)
- "Example(s): $ SKELETONTABLE/NOLOG FGGE3B",
- " $ SKELETONTABLE/SKELETON=FGGE3BX FGGE3B",
- " $ SKELETONTABLE/SKELETON=FGGE3BX/noNRV FGGE3B",
- #endif
- #if defined(unix)
- "Example(s): % skeletontable -nolog fgge3b",
- " % skeletontable -skeleton fgge3bx ../fgge3b",
- " % skeletontable -skeleton ~user/cdf/fgge3b -noNRV fgge3b",
- #endif
- #if defined(__MSDOS__)
- "Example(s): > skeletontable -nolog fgge3b",
- " > skeletontable -skeleton fgge3bx a:\\fgge3b",
- " > skeletontable -skeleton ..\\fgge3b -noNRV fgge3b",
- #endif
- NULL };
-
- /******************************************************************************
- * main (cdf2skt).
- ******************************************************************************/
-
- #if defined(vms)
- main (argc, argv)
- #else
- void main (argc, argv)
- #endif
- int argc;
- char *argv[];
- {
- CDFstatus status;
-
- char CDFpath[MAX_PATH_LEN+1];
- char CDFpathX[MAX_PATH_LEN+1];
- char CDFname[MAX_NAME_LEN+1];
- char dir[MAX_DIR_LEN+1];
- char SKTpath[MAX_PATH_LEN+1];
- char SKTpathX[MAX_PATH_LEN+1];
- char NRVpath[MAX_PATH_LEN+1];
- char NRVpathX[MAX_PATH_LEN+1];
- char creationStamp[80+1];
-
- int count;
- QOP *qop;
- static char *validQuals[] = { "skeleton", "noNRV", "NRVfile", "NRVtable",
- "log", "nolog", NULL };
- static int optRequired[] = { TRUE, FALSE, FALSE, FALSE,
- FALSE, FALSE, 0 };
-
- /******************************************************************************
- * Parse qualifiers/options/parameters (QOP).
- ******************************************************************************/
-
- switch (argc) {
- case 1:
- PageInst (instructions);
- Exit;
-
- default:
- qop = Qop (argc, argv, validQuals, optRequired);
- if (qop == NULL) ExitBAD;
-
- /**************************************************************************
- * Get CDF pathname.
- **************************************************************************/
-
- if (qop->Nparms < 1) {
- printf ("Missing parameter.\n");
- ExitBAD;
- }
- else {
- strcpy (CDFpath, qop->parms[0]);
- ParsePath (CDFpath, dir, CDFname);
- }
-
- /**************************************************************************
- * Check if a skeleton table pathname was specified.
- **************************************************************************/
-
- if (qop->qualEntered[0])
- strcpy (SKTpath, qop->qualOpt[0]);
- else
- strcpy (SKTpath, CDFname);
-
- /**************************************************************************
- * Check if the location of NRV data was specified.
- **************************************************************************/
-
- count = 0;
- if (qop->qualEntered[1]) count++;
- if (qop->qualEntered[2]) count++;
- if (qop->qualEntered[3]) count++;
-
- switch (count) {
- case 0:
- NRVloc = NRVinSKT;
- break;
-
- case 1:
- if (qop->qualEntered[1]) {
- NRVloc = noNRV;
- break;
- }
-
- if (qop->qualEntered[2]) {
- NRVloc = NRVinNRV;
- strcpy (NRVpath, SKTpath);
- break;
- }
-
- if (qop->qualEntered[3]) {
- NRVloc = NRVinSKT;
- break;
- }
- break;
-
- case 2:
- case 3:
- default:
- printf ("Specify only one NRV location\n");
- ExitBAD;
- }
-
- /**************************************************************************
- * Check if message logging was specified.
- **************************************************************************/
-
- count = 0;
- if (qop->qualEntered[4]) count++;
- if (qop->qualEntered[5]) count++;
-
- switch (count) {
- case 0:
- mLog = FALSE;
- break;
- case 1:
- if (qop->qualEntered[4])
- mLog = TRUE;
- else
- mLog = FALSE;
- break;
- default:
- printf ("Conflicting qualifiers.\n");
- ExitBAD;
- }
- }
-
- /*****************************************************************************/
-
- if (mLog) printf ("\nName of CDF: %s\n", CDFname);
-
- /******************************************************************************
- * Open skeleton table.
- ******************************************************************************/
-
- strcat (SKTpath,".skt");
- if (mLog) printf ("\nName of Skeleton Table: %s\n", SKTpath);
-
- strcpy (creationStamp, dateStamp());
-
- ExpandPath (SKTpath, SKTpathX);
- SKTfp = fopen (SKTpathX, "w");
- if (SKTfp == NULL) {
- printf ("Error creating skeleton table (%s).\n", SKTpath);
- ExitBAD;
- }
-
- fprintf (SKTfp, "! Skeleton table for the \"%s\" CDF.", CDFname);
- fprintf (SKTfp, "\n! Generated: %s", creationStamp);
-
- /******************************************************************************
- * Open NRV file (if requested).
- ******************************************************************************/
-
- switch (NRVloc) {
- case NRVinNRV:
- strcat (NRVpath, ".nrv");
- if (mLog) printf ("\nNRV Data in: %s\n", NRVpath);
- ExpandPath (NRVpath, NRVpathX);
- NRVfp = fopen (NRVpathX, "w");
- if (NRVfp == NULL) {
- printf ("Error creating NRV file (%s).\n", NRVpath);
- ExitBAD;
- }
- fprintf (NRVfp, "! NRV file for the \"%s\" CDF.", CDFname);
- fprintf (NRVfp, "\n! Generated: %s", creationStamp);
- break;
- case NRVinSKT:
- if (mLog) printf ("\nNRV Data in: %s\n", SKTpath);
- break;
- case noNRV:
- if (mLog) printf ("\nNRV Data is ignored.\n");
- break;
- }
-
- /******************************************************************************
- * Open CDF.
- ******************************************************************************/
-
- ExpandPath (CDFpath, CDFpathX);
- status = CDFlib (OPEN_, CDF_, CDFpathX, &id,
- NULL_);
- StatusHandler (status);
-
- /******************************************************************************
- * Write header section.
- ******************************************************************************/
-
- if (mLog) printf ("\nPrinting Header Information...\n");
- WriteHeader (CDFname);
-
- /******************************************************************************
- * Write global scope attributes section.
- ******************************************************************************/
-
- if (mLog) printf ("\nPrinting Attribute Information...\n");
- WriteGlobalAttr ();
-
- /******************************************************************************
- * Write variable scope attributes section.
- ******************************************************************************/
-
- WriteVarAttr ();
-
- /******************************************************************************
- * Write variables section.
- ******************************************************************************/
-
- if (mLog) printf ("\nPrinting Variable Information...\n\n");
- WriteVar (NRVloc);
-
- /******************************************************************************
- * End section.
- ******************************************************************************/
-
- WriteEnd ();
-
- /******************************************************************************
- * Clean up.
- ******************************************************************************/
-
- status = CDFlib (SELECT_, CDF_, id,
- CLOSE_, CDF_,
- NULL_);
- StatusHandler (status);
-
- fprintf (SKTfp, "\n");
- fclose (SKTfp);
-
- if (NRVloc == NRVinNRV) {
- fprintf (NRVfp, "\n");
- fclose (NRVfp);
- }
-
- Exit;
- }
-
-
- /******************************************************************************
- * WriteHeader.
- ******************************************************************************/
-
- void WriteHeader (CDFname)
- char *CDFname;
- {
- CDFstatus status;
- long encoding, majority, format;
- long numDims;
- long dimSizes[CDF_MAX_DIMS];
- long numVars, numAttrs, maxRec;
- long numVattrs = 0, numGattrs = 0;
- long attrN;
- long scope;
- int dimN;
- char sizes[80+1];
- int Nblanks, Ndashes;
-
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n#header");
-
- status = CDFlib (SELECT_, CDF_, id,
- GET_, CDF_ENCODING_, &encoding,
- CDF_MAJORITY_, &majority,
- CDF_FORMAT_, &format,
- CDF_NUMDIMS_, &numDims,
- CDF_DIMSIZES_, dimSizes,
- CDF_NUMVARS_, &numVars,
- CDF_NUMATTRS_, &numAttrs,
- CDF_MAXREC_, &maxRec,
- NULL_);
- StatusHandler (status);
-
- for (attrN = 0; attrN < numAttrs; attrN++) {
- status = CDFlib (SELECT_, CDF_, id,
- ATTR_, attrN,
- GET_, ATTR_SCOPE_, &scope,
- NULL_);
- StatusHandler (status);
-
- switch (scope) {
- case GLOBAL_SCOPE:
- case GLOBAL_SCOPE_ASSUMED:
- numGattrs++;
- break;
- case VARIABLE_SCOPE:
- case VARIABLE_SCOPE_ASSUMED:
- numVattrs++;
- break;
- }
- }
-
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n CDF NAME: %s", CDFname);
-
- fprintf (SKTfp, "\n DATA ENCODING: %s", EncodingToken(encoding));
- fprintf (SKTfp, "\n MAJORITY: %s", MajorityToken(majority));
- fprintf (SKTfp, "\n FORMAT: %s", FormatToken(format));
-
- if (numDims > 0) {
- sizes[0] = NUL;
- for (dimN = 0; dimN < numDims; dimN++) sprintf (&sizes[strlen(sizes)],
- "%ld ", dimSizes[dimN]);
- sizes[strlen(sizes)-1] = NUL; /* Wipe out trailing blank. */
- }
- else
- strcpy (sizes, "! n/a");
-
- fprintf (SKTfp, "\n");
- fprintf (SKTfp,
- "\n! Variables G.Attributes V.Attributes Records Dims ");
-
- if (strlen(sizes) > 5) {
- Nblanks = (strlen(sizes)-5) / 2;
- nCHARACTERS (SKTfp, Nblanks, ' ');
- }
- fprintf (SKTfp, "Sizes");
-
- fprintf (SKTfp,
- "\n! --------- ------------ ------------ ------- ---- ");
-
- Ndashes = strlen(sizes) > 5 ? strlen(sizes) : 5;
- nCHARACTERS (SKTfp, Ndashes, '-');
-
- fprintf (SKTfp, "\n%7ld %11ld %12ld %9ld %6ld ", numVars, numGattrs,
- numVattrs, maxRec + 1,
- numDims);
-
- if (strlen(sizes) < 5) {
- Nblanks = (5-strlen(sizes)) / 2;
- nCHARACTERS (SKTfp, Nblanks, ' ');
- }
- fprintf (SKTfp, "%s", sizes);
-
- return;
- }
-
-
- /******************************************************************************
- * WriteGlobalAttr.
- ******************************************************************************/
-
- void WriteGlobalAttr ()
- {
- CDFstatus status;
- char delim; /* Delimeter for attribute name. */
- long attrN, numAttrs, scope, maxEntry;
- long dataType, numElements, entryN;
- int ccc; /* Current Cursor Column (base is 0). */
- void *value;
- char attrName[CDF_ATTR_NAME_LEN+1];
- int GattrCount = 0; /* Number of global scope attributes. */
- int entryCount;
-
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n#GLOBALattributes");
-
- status = CDFlib (SELECT_, CDF_, id,
- GET_, CDF_NUMATTRS_, &numAttrs,
- NULL_);
- StatusHandler (status);
-
- if (numAttrs > 0) {
- for (attrN = 0; attrN < numAttrs; attrN++) {
- status = CDFlib (SELECT_, CDF_, id,
- ATTR_, attrN,
- GET_, ATTR_NAME_, attrName,
- ATTR_SCOPE_, &scope,
- ATTR_MAXENTRY_, &maxEntry,
- NULL_);
- StatusHandler (status);
- if (scope == GLOBAL_SCOPE || scope == GLOBAL_SCOPE_ASSUMED) {
- /***********************************************************************
- * Global scope attribute...
- ***********************************************************************/
-
- GattrCount++;
-
- /***********************************************************************
- * If first global scope attribute found, print field headings.
- ***********************************************************************/
-
- if (GattrCount == 1) {
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, "! Attribute");
- nCHARACTERS (SKTfp, ENTRY_NUM_COL - ccc, ' ');
- ccc += ENTRY_NUM_COL - ccc;
- ccc += fprintf (SKTfp, "Entry Data");
-
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, "! Name ");
- nCHARACTERS (SKTfp, ENTRY_NUM_COL - ccc, ' ');
- ccc += ENTRY_NUM_COL - ccc;
- ccc += fprintf (SKTfp, "Number Type Value");
-
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, "! ---------");
- nCHARACTERS (SKTfp, ENTRY_NUM_COL - ccc, ' ');
- ccc += ENTRY_NUM_COL - ccc;
- ccc += fprintf (SKTfp, "------ ---- -----");
- }
-
- /***********************************************************************
- * Write name.
- ***********************************************************************/
-
- delim = PickDelim (attrName);
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, " %c%s%c", delim, attrName, delim);
-
- /***********************************************************************
- * Write each entry.
- ***********************************************************************/
-
- entryCount = 0;
-
- for (entryN = 0; entryN <= maxEntry; entryN++) {
- status = CDFlib (SELECT_, CDF_, id,
- ENTRY_, entryN,
- GET_, ENTRY_DATATYPE_, &dataType,
- ENTRY_NUMELEMS_, &numElements,
- NULL_);
- if (status != NO_SUCH_ENTRY) {
- StatusHandler (status);
- entryCount++;
-
- MALLOC (value, ElemSize(dataType) * numElements);
-
- status = CDFlib (SELECT_, CDF_, id,
- GET_, ENTRY_DATA_, value,
- NULL_);
- StatusHandler (status);
-
- if (entryCount == 1) {
- if (ccc > ENTRY_NUM_COL - 1) {
- fprintf (SKTfp, "\n");
- ccc = 0;
- }
- }
- else {
- fprintf (SKTfp, "\n");
- ccc = 0;
- }
-
- nCHARACTERS (SKTfp, ENTRY_NUM_COL - ccc, ' ');
- ccc += ENTRY_NUM_COL - ccc;
-
- ccc += fprintf (SKTfp, "%*ld: %s ",
- ENTRY_NUM_WIDTH, entryN + 1, DataType(dataType));
-
- ccc += fprintf (SKTfp, "{ ");
- WriteEntryValue (SKTfp, dataType, numElements,
- value, ccc,
- MAX_COL_TO_USE - 4); /* -4 for possible " } ." */
- ccc += fprintf (SKTfp, " }");
-
- free (value);
- }
- }
- /***********************************************************************
- * Write '.' after last entry.
- ***********************************************************************/
-
- fprintf (SKTfp, " .");
- }
- }
- if (GattrCount == 0) fprintf (SKTfp, "\n\n! No global scope attributes.");
- }
- else
- fprintf (SKTfp, "\n\n! No global scope attributes.");
-
- return;
- }
-
-
- /******************************************************************************
- * WriteVarAttr.
- ******************************************************************************/
-
- void WriteVarAttr ()
- {
- CDFstatus status;
- char delim; /* Delimeter for attribute name. */
- long attrN, numAttrs, scope;
- char attrName[CDF_ATTR_NAME_LEN+1];
- int VattrCount = 0; /* Number of variable scope attributes. */
-
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n#VARIABLEattributes");
- fprintf (SKTfp, "\n");
-
- status = CDFlib (SELECT_, CDF_, id,
- GET_, CDF_NUMATTRS_, &numAttrs,
- NULL_);
- StatusHandler (status);
-
- if (numAttrs > 0) {
- for (attrN = 0; attrN < numAttrs; attrN++) {
- status = CDFlib (SELECT_, CDF_, id,
- ATTR_, attrN,
- GET_, ATTR_NAME_, attrName,
- ATTR_SCOPE_, &scope,
- NULL_);
- StatusHandler (status);
- if (scope == VARIABLE_SCOPE || scope == VARIABLE_SCOPE_ASSUMED) {
- /***********************************************************************
- * Variable scope attribute...
- ***********************************************************************/
- VattrCount++;
- delim = PickDelim (attrName);
- fprintf (SKTfp, "\n %c%s%c", delim, attrName, delim);
- }
- }
- if (VattrCount == 0) fprintf (SKTfp, "\n! No variable scope attributes.");
- }
- else
- fprintf (SKTfp, "\n! No variable scope attributes.");
-
- return;
- }
-
-
- /******************************************************************************
- * WriteVar.
- ******************************************************************************/
-
- void WriteVar (NRVloc)
- enum NRVlocENUM NRVloc;
- {
- CDFstatus status;
- long numDims, numVars, numAttrs;
- long maxRec;
- long varDataType, varNumElements;
- long entryDataType, entryNumElements;
- long recVary, dimVarys[CDF_MAX_DIMS];
- char varName[CDF_VAR_NAME_LEN+1];
- char attrName[CDF_ATTR_NAME_LEN+1];
- char delim;
- long varN, attrN;
- long scope;
- int dimN;
- int ccc; /* Current Cursor Column (base is 0). */
- void *value;
- int VattrCount;
- char varys[80+1];
- int Nblanks, Ndashes;
-
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n#variables");
-
- status = CDFlib (SELECT_, CDF_, id,
- GET_, CDF_NUMDIMS_, &numDims,
- CDF_NUMVARS_, &numVars,
- CDF_NUMATTRS_, &numAttrs,
- CDF_MAXREC_, &maxRec,
- NULL_);
- StatusHandler (status);
-
- /******************************************************************************
- * Are there any variables?...
- ******************************************************************************/
-
- if (numVars == 0) {
- fprintf (SKTfp, "\n\n! No variables.");
- if (NRVloc == NRVinNRV) fprintf (NRVfp, "\n\n! No variables.");
- return;
- }
-
- /******************************************************************************
- * ...yes, print them.
- ******************************************************************************/
-
- for (varN = 0; varN < numVars; varN++) {
- /***************************************************************************
- * Inquire variable.
- ***************************************************************************/
-
- status = CDFlib (SELECT_, CDF_, id,
- VAR_, varN,
- GET_, VAR_NAME_, varName,
- VAR_DATATYPE_, &varDataType,
- VAR_NUMELEMS_, &varNumElements,
- VAR_RECVARY_, &recVary,
- VAR_DIMVARYS_, dimVarys,
- NULL_);
- StatusHandler (status);
-
- /***************************************************************************
- * Build dimension variance string.
- ***************************************************************************/
-
- if (numDims > 0) {
- varys[0] = NUL;
- for (dimN = 0; dimN < numDims; dimN++) {
- strcat (varys, TFvarianceToken(dimVarys[dimN]));
- strcat (varys, " ");
- }
- varys[strlen(varys)-1] = NUL; /* Wipe out trailing blank. */
- }
- else
- strcpy (varys, "! n/a");
-
- /***************************************************************************
- * Write headings.
- ***************************************************************************/
-
- if (varN != 0) fprintf (SKTfp, "\n"); /* Skip 2 lines after first
- variables. */
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, "! Variable");
- nCHARACTERS (SKTfp, VAR_DATATYPE_COL - ccc, ' ');
- ccc += VAR_DATATYPE_COL - ccc;
- ccc += fprintf (SKTfp, " Data Number Record ");
-
- if (strlen(varys) > 9) {
- Nblanks = (strlen(varys)-9) / 2;
- nCHARACTERS (SKTfp, Nblanks, ' ');
- }
- fprintf (SKTfp, "Dimension");
-
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, "! Name ");
- nCHARACTERS (SKTfp, VAR_DATATYPE_COL - ccc, ' ');
- ccc += VAR_DATATYPE_COL - ccc;
- ccc += fprintf (SKTfp, " Type Elements Variance ");
-
- if (strlen(varys) > 9) {
- Nblanks = (strlen(varys)-9) / 2;
- nCHARACTERS (SKTfp, Nblanks, ' ');
- }
- fprintf (SKTfp, "Variances");
-
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, "! --------");
- nCHARACTERS (SKTfp, VAR_DATATYPE_COL - ccc, ' ');
- ccc += VAR_DATATYPE_COL - ccc;
- ccc += fprintf (SKTfp, " ---- -------- -------- ");
-
- Ndashes = strlen(varys) > 9 ? strlen(varys) : 9;
- nCHARACTERS (SKTfp, Ndashes, '-');
-
- /***************************************************************************
- * Write variable definition line.
- ***************************************************************************/
-
- fprintf (SKTfp, "\n");
-
- delim = PickDelim (varName);
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, " %c%s%c", delim, varName, delim);
-
- if (ccc > VAR_DATATYPE_COL - 3) {
- fprintf (SKTfp, "\n");
- ccc = 0;
- }
-
- nCHARACTERS (SKTfp, VAR_DATATYPE_COL - ccc, ' ');
- ccc += VAR_DATATYPE_COL - ccc;
-
- ccc += fprintf (SKTfp, "%s %*ld %c ",
- DataType(varDataType), VAR_NUMELEMS_WIDTH, varNumElements,
- (recVary ? 'T' : 'F'));
-
- if (strlen(varys) < 9) {
- Nblanks = (9-strlen(varys)) / 2;
- nCHARACTERS (SKTfp, Nblanks, ' ');
- }
- fprintf (SKTfp, "%s", varys);
-
- /***************************************************************************
- * Write corresponding attribute entries.
- ***************************************************************************/
-
- VattrCount = 0;
-
- fprintf (SKTfp, "\n");
-
- for (attrN = 0; attrN < numAttrs; attrN++) {
- status = CDFlib (SELECT_, CDF_, id,
- ATTR_, attrN,
- GET_, ATTR_SCOPE_, &scope,
- ATTR_NAME_, attrName,
- NULL_);
- StatusHandler (status);
-
- if (scope == VARIABLE_SCOPE || scope == VARIABLE_SCOPE_ASSUMED) {
- status = CDFlib (SELECT_, CDF_, id,
- ENTRY_, varN,
- GET_, ENTRY_DATATYPE_, &entryDataType,
- ENTRY_NUMELEMS_, &entryNumElements,
- NULL_);
- if (status != NO_SUCH_ENTRY) {
- StatusHandler (status);
- VattrCount++;
-
- if (VattrCount == 1) {
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, " ! Attribute");
- nCHARACTERS (SKTfp, ENTRY_DATATYPE_COL - ccc, ' ');
- ccc += ENTRY_DATATYPE_COL - ccc;
- ccc += fprintf (SKTfp, " Data");
-
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, " ! Name ");
- nCHARACTERS (SKTfp, ENTRY_DATATYPE_COL - ccc, ' ');
- ccc += ENTRY_DATATYPE_COL - ccc;
- ccc += fprintf (SKTfp, " Type Value");
-
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, " ! --------");
- nCHARACTERS (SKTfp, ENTRY_DATATYPE_COL - ccc, ' ');
- ccc += ENTRY_DATATYPE_COL - ccc;
- ccc += fprintf (SKTfp, " ---- -----");
-
- fprintf (SKTfp, "\n");
- }
-
- MALLOC (value, entryNumElements * ElemSize(entryDataType));
-
- status = CDFlib (SELECT_, CDF_, id,
- GET_, ENTRY_DATA_, value,
- NULL_);
- StatusHandler (status);
-
- delim = PickDelim (attrName);
- fprintf (SKTfp, "\n");
- ccc = fprintf (SKTfp, " %c%s%c", delim, attrName, delim);
-
- if (ccc > ENTRY_DATATYPE_COL - 3) {
- fprintf (SKTfp, "\n");
- ccc = 0;
- }
-
- nCHARACTERS (SKTfp, ENTRY_DATATYPE_COL - ccc, ' ');
- ccc += ENTRY_DATATYPE_COL - ccc;
-
- ccc += fprintf (SKTfp, "%s ", DataType(entryDataType));
-
- ccc += fprintf (SKTfp, "{ ");
- WriteEntryValue (SKTfp, entryDataType, entryNumElements,
- value, ccc,
- MAX_COL_TO_USE - 4); /* -4 for possible " } ." */
- ccc += fprintf (SKTfp, " }");
-
- free (value);
- }
- }
- }
-
- if (VattrCount == 0) {
- fprintf (SKTfp,
- "\n ! No variable scope attribute entries for this variable.");
- }
-
- /***************************************************************************
- * Write terminating period.
- ***************************************************************************/
-
- if (VattrCount == 0) {
- fprintf (SKTfp, "\n\n .");
- fprintf (SKTfp,
- " ! Terminating period required.");
- }
- else
- fprintf (SKTfp, " .");
-
- /***************************************************************************
- * Write NRV data (if requested).
- ***************************************************************************/
-
- if (! recVary)
- switch (NRVloc) {
- case noNRV:
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n ! NRV values were not requested.");
- break;
-
- case NRVinSKT:
- fprintf (SKTfp, "\n");
- if (maxRec > -1) {
- fprintf (SKTfp, "\n ! NRV values follow...");
- fprintf (SKTfp, "\n");
- WriteNRVdata (SKTfp, varN, varDataType, varNumElements, dimVarys);
- }
- else
- fprintf (SKTfp,"\n ! No NRV values (no records in CDF).");
- break;
-
- case NRVinNRV:
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n ! NRV values in NRV file.");
-
- if (maxRec > -1) {
- delim = PickDelim (varName);
- fprintf (NRVfp, "\n");
- fprintf (NRVfp, "\n%c%s%c", delim, varName, delim);
- fprintf (NRVfp, "\n");
- WriteNRVdata (NRVfp, varN, varDataType, varNumElements, dimVarys);
- }
- else { /* Only one comment (on first variable). */
- if (varN == 0)
- fprintf (NRVfp, "\n\n! No NRV values (no records in CDF).");
- }
-
- break;
- }
- }
-
- return;
- }
-
-
- /******************************************************************************
- * WriteEnd.
- ******************************************************************************/
-
- void WriteEnd ()
- {
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n#end");
-
- return;
- }
-
-
- /******************************************************************************
- * WriteNRVdata. It is assumed that there is at least one record in the CDF.
- ******************************************************************************/
-
- void WriteNRVdata (fp, varN, dataType, numElements, dimVarys)
- FILE *fp;
- long varN;
- long dataType;
- long numElements;
- long dimVarys[];
- {
- CDFstatus status;
- long indices[CDF_MAX_DIMS];
- long counts[CDF_MAX_DIMS];
- void *value;
- long numDims, dimSizes[CDF_MAX_DIMS];
- long majority;
- int ccc;
- long nValues, i;
- int dimN;
- char Evalue[80+1];
-
- status = CDFlib (SELECT_, CDF_, id,
- GET_, CDF_NUMDIMS_, &numDims,
- CDF_DIMSIZES_, dimSizes,
- CDF_MAJORITY_, &majority,
- NULL_);
- StatusHandler (status);
-
- nValues = 1;
- if (numDims > 0)
- for (dimN = 0; dimN < numDims; dimN++) {
- indices[dimN] = 0;
- if (dimVarys[dimN]) {
- nValues *= dimSizes[dimN];
- counts[dimN] = dimSizes[dimN];
- }
- else
- counts[dimN] = 1;
- }
-
- MALLOC (value, numElements * ElemSize(dataType));
-
- status = CDFlib (SELECT_, CDF_, id,
- VAR_, varN,
- CDF_RECNUMBER_, (long) 0,
- NULL_);
- StatusHandler (status);
-
- for (i = 0; i < nValues; i++) {
- status = CDFlib (SELECT_, CDF_, id,
- CDF_DIMINDICES_, indices,
- GET_, VAR_DATA_, value,
- NULL_);
- StatusHandler (status);
-
- fprintf (fp, "\n");
- ccc = fprintf (fp, " [");
-
- if (numDims > 0)
- for (dimN = 0; dimN < numDims; dimN++) {
- ccc += fprintf (fp, " %ld", indices[dimN] + 1);
- if (dimN != numDims - 1) ccc += fprintf (fp, ",");
- }
-
- ccc += fprintf (fp, " ] = ");
-
- switch (dataType) {
- case CDF_CHAR:
- case CDF_UCHAR:
- ccc += fprintf (fp, "{ ");
- WriteStringValue (fp, numElements, value,
- ccc, MAX_COL_TO_USE + 2); /* +2 for " }" */
- fprintf (fp, " }"); /* Don't care about
- 'ccc' anymore. */
- break;
- default:
- EncodeValue (dataType, value, Evalue); /* Don't care about width. */
- fprintf (fp, "%s", Evalue);
- break;
- }
-
- if (majority == ROW_MAJOR) {
- INCRindicesROW (numDims, counts, indices);
- }
- else {
- INCRindicesCOL (numDims, counts, indices);
- }
- }
-
- return;
- }
-
- /******************************************************************************
- * DataType. Return address of character string for data type.
- ******************************************************************************/
-
- char *DataType(dataType)
- long dataType;
- {
- switch (dataType) {
- case CDF_BYTE: return "CDF_BYTE ";
- case CDF_INT1: return "CDF_INT1 ";
- case CDF_INT2: return "CDF_INT2 ";
- case CDF_INT4: return "CDF_INT4 ";
- case CDF_UINT1: return "CDF_UINT1 ";
- case CDF_UINT2: return "CDF_UINT2 ";
- case CDF_UINT4: return "CDF_UINT4 ";
- case CDF_REAL4: return "CDF_REAL4 ";
- case CDF_REAL8: return "CDF_REAL8 ";
- case CDF_FLOAT: return "CDF_FLOAT ";
- case CDF_DOUBLE: return "CDF_DOUBLE";
- case CDF_EPOCH: return "CDF_EPOCH ";
- case CDF_CHAR: return "CDF_CHAR ";
- case CDF_UCHAR: return "CDF_UCHAR ";
- }
- return "??????????";
- }
-
- /******************************************************************************
- * StatusHandler.
- ******************************************************************************/
-
- void StatusHandler (status)
- CDFstatus status;
- {
- char text[CDF_STATUSTEXT_LEN + 1];
-
- if (status == CDF_OK) return; /* Do nothing. */
-
- CDFlib (SELECT_, CDF_STATUS_, status,
- GET_, STATUS_TEXT_, text,
- NULL_);
-
- if (status < CDF_WARN) {
- printf ("\nERROR> %s\n", text);
- CDFlib (SELECT_, CDF_, id,
- CLOSE_, CDF_,
- NULL_);
-
- printf ("**** THE SKELETON TABLE IS INCOMPLETE ****\n");
- fprintf (SKTfp, "\n");
- fprintf (SKTfp, "\n**** THIS SKELETON TABLE IS NOT COMPLETE ****");
- fprintf (SKTfp, "\n");
- fclose (SKTfp);
-
- if (NRVloc == NRVinNRV) {
- printf ("**** THE NRV FILE IS INCOMPLETE ****\n");
- fprintf (NRVfp, "\n");
- fprintf (NRVfp, "\n**** THIS NRV FILE IS NOT COMPLETE ****");
- fprintf (NRVfp, "\n");
- fclose (NRVfp);
- }
-
- ExitBAD;
- }
- else
- if (mLog)
- if (status < CDF_OK)
- printf ("WARNING> %s\n", text);
- else
- printf ("INFO> %s\n", text);
-
- return;
- }
-